home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / game / pr / src / mmv2.02 < prev    next >
Text File  |  1995-08-20  |  19KB  |  750 lines

  1. /*===================================
  2.     Make polygon Map data
  3.                 3D test version.
  4. ===================================*/
  5. #include    <stdio.h>
  6. #include    <stdlib.h>
  7. #include    <string.h>
  8. #include    <math.h>
  9. #include    <egb.h>
  10. #include    <filekh.h>
  11.  
  12. char    EgbWork[EgbWorkSize];
  13.  
  14. #define    MAPFILE    "course02.pmd"
  15. #define    C32K(b,r,g)    (0x01*(b)+0x020*(r)+0x400*(g))
  16. #define C32B(col)    ((col)%0x20)
  17. #define C32R(col)    (((col)/0x20)%0x20)
  18. #define C32G(col)    ((col)/0x400)
  19. #define    ROADCOL C32K(18,12,12)
  20. #define EDCOL1  C32K(0,30,0)
  21. #define EDCOL2  C32K(30,30,30)
  22. #define EDGE    5
  23.  
  24. typedef struct {
  25.     short    x,y,z;
  26. } p3d;
  27. typedef struct {                /*    Polygon データ    */
  28.     p3d        pt[4];
  29.     short    type;
  30. } poly;
  31. typedef struct {
  32.     short    px[4];
  33.     short    py[4];
  34.     short    pz;
  35.     p3d        kv;
  36. } rdata;
  37.  
  38. #define RMAX 1800
  39. #define PMAX 6000
  40. #define STEP 400
  41. #define CSTEP 200
  42. //#define    MINSTEP    20
  43. #define RDMAG 4/5
  44.  
  45. typedef struct {
  46.     short x,y,z;
  47.     short wl,wr;
  48.     short bank;
  49.     short stp;
  50. } Road;
  51. Road road[RMAX];
  52.  
  53. poly    rdpol[RMAX];
  54. rdata    rddat[RMAX];
  55. short    polmax,pn,rd=0;
  56. poly    mapdata[PMAX];
  57. short    chk[20],chks,exTime[20];
  58.  
  59. //    objects
  60. poly    mt[4];
  61. poly    stand[12];
  62. poly    gt[3];
  63. poly    pd[3];
  64. poly    cp[2];
  65. poly    cvp[5];
  66.  
  67. short    step=STEP;
  68. double    cang=0;    // current angle
  69. short    cx=0,cy=0,cz=0;
  70. short    cwl=0,cwr=0,cbank=0;
  71. double    pi=_PI;
  72. int        crd=0;    // current road number
  73.  
  74. /*=======================================
  75.     subroutines for setting road[]
  76. =======================================*/
  77. void setR( short stp )
  78. {
  79.     if( crd>=RMAX ) exit ;
  80.     road[crd].x = cx ;
  81.     road[crd].y = cy ;
  82.     road[crd].z = cz+150 ;
  83.     road[crd].wl = cwl ;
  84.     road[crd].wr = cwr ;
  85.     road[crd].bank = cbank ;
  86.     road[crd].stp = stp ;
  87. //    printf("<%d,%d,%d>\n",cx,cy,cz);
  88. }
  89.  
  90. void
  91. goStr( len, nz )
  92.     short    len, nz ;
  93. {
  94.     printf("go strait : %d[%d]\n",len,nz);
  95.     short    clen=0;
  96.     short    sx=cx,sy=cy,sz=cz;
  97.     int        i,j=len/STEP+1 ;
  98.     for(i=1; i<=j; ++i)
  99.     {
  100.         clen = len*i/j ;
  101.         crd++ ;
  102.         cx = sx + clen*cos(cang) ;
  103.         cy = sy + clen*sin(cang) ;
  104.         cz = sz + (nz-sz)*clen/len ;
  105.         setR(len/j);
  106.     }
  107. }
  108.  
  109. void 
  110. curveRt( r, nang, nz, nbank )
  111.     short    r;
  112.     double    nang;
  113.     short    nz, nbank;
  114. {
  115.     printf("curve Right : r=%d,nang=%f,nz=%d\n",r,nang,nz);
  116.     short    ox,oy, sz=cz ;
  117.     short    sbank=cbank ;
  118.     double    sang=cang;
  119.     int        i,j=r*(nang-sang)/CSTEP+1;
  120.     ox = cx - r*sin(cang) ;
  121.     oy = cy + r*cos(cang) ;
  122.     for(i=1; i<=j; ++i)
  123.     {
  124.         cang = sang+(nang-sang)*i/j ;
  125.         ++crd ;
  126.         cx = ox + r*sin(cang) ;
  127.         cy = oy - r*cos(cang) ;
  128.         cz = sz + (nz-sz)*i/j ;
  129.         cbank = sbank + (nbank-sbank)*i/j ;
  130.         setR(r*(nang-sang)/j);
  131. //        if( r<=600 )
  132. //            setCvp( cx,cy,cz+500,cang );
  133.     }
  134.     cang = nang ;
  135.     cz = nz ;
  136.     cbank = nbank;
  137. }
  138. void 
  139. curveLf( r, nang, nz, nbank )
  140.     short    r;
  141.     double    nang;
  142.     short    nz, nbank;
  143. {
  144.     printf("curve Left : %d[%d]\n",r,nz);
  145.     short    ox,oy, sz=cz ;
  146.     short    sbank=cbank ;
  147.     double  sang=cang;
  148.     int        i,j=r*(sang-nang)/CSTEP+1;
  149.     nbank = -nbank ;
  150.     ox = cx + r*sin(cang) ;
  151.     oy = cy - r*cos(cang) ;
  152.     for(i=1; i<=j; ++i)
  153.     {
  154.         cang = sang+(nang-sang)*i/j ;
  155.         ++crd ;
  156.         cx = ox - r*sin(cang) ;
  157.         cy = oy + r*cos(cang) ;
  158.         cz = sz + (nz-sz)*i/j ;
  159.         cbank = sbank + (nbank-sbank)*i/j ;
  160.         setR(r*(sang-nang)/j) ;
  161. //        if( r<=600 )
  162. //            setCvp( cx,cy,cz+500,cang+pi );
  163.     }
  164.     cang = nang ;
  165.     cz = nz ;
  166.     cbank = nbank;
  167. }
  168.  
  169. /*====================
  170.     pol -> kvect
  171. ====================*/
  172. p3d ortholize( p3d vec )
  173. {
  174.     double l;
  175.     l = sqrt(vec.x*vec.x+vec.y*vec.y+vec.z*vec.z) ;
  176.     if(l==0) return vec;
  177.  
  178.     vec.x = (double)vec.x*1000/l ;
  179.     vec.y = (double)vec.y*1000/l ;
  180.     vec.z = (double)vec.z*1000/l ;
  181.     return vec ;
  182. }
  183. p3d    exterior( poly pol )
  184. {
  185.     p3d    kv;
  186.     kv.x = (pol.pt[1].y-pol.pt[0].y)*(pol.pt[3].z-pol.pt[0].z)/100
  187.           -(pol.pt[1].z-pol.pt[0].z)*(pol.pt[3].y-pol.pt[0].y)/100 ;
  188.     kv.y = (pol.pt[1].z-pol.pt[0].z)*(pol.pt[3].x-pol.pt[0].x)/100
  189.           -(pol.pt[1].x-pol.pt[0].x)*(pol.pt[3].z-pol.pt[0].z)/100 ;
  190.     kv.z = (pol.pt[1].x-pol.pt[0].x)*(pol.pt[3].y-pol.pt[0].y)/10
  191.           -(pol.pt[1].y-pol.pt[0].y)*(pol.pt[3].x-pol.pt[0].x)/10 ;
  192.     return ortholize( kv );
  193. }
  194. int    inner( p3d a, p3d b )
  195. {
  196.     int i ;
  197.     i = a.x*b.x ;
  198.     i+= a.y*b.y ;
  199.     i+= a.z*b.z ;
  200.     return i ;
  201. }
  202. /*==========================
  203.     超簡易レンダリング?
  204. ==========================*/
  205. short colset( poly pol )
  206. {
  207.     p3d ray ;
  208.     ray.x=1,ray.y=1,ray.z=2 ;
  209.     ray = ortholize( ray ) ;
  210.     p3d kv ;
  211.     kv = exterior( pol ) ;
  212.     int i;
  213.     i = _abs( inner(ray,kv) )/100 ;    // 0 <= i <= 10000
  214.     i = ( 4000 + i*7/10 ) ;        // 環境光 40%
  215.  
  216.     int    b,r,g;
  217.     b = C32B(pol.type) ;
  218.     r = C32R(pol.type) ;
  219.     g = C32G(pol.type) ;
  220.  
  221.     b = ((b*i)/10000) ; b = _min(31,b) ;
  222.     r = ((r*i)/10000) ; r = _min(31,r) ;
  223.     g = ((g*i)/10000) ; g = _min(31,g) ;
  224.     return C32K(b,r,g);
  225. }
  226. /*=================================
  227.     road[] -> mapdata[],rddat[]
  228. =================================*/
  229. #define    X(i)    (road[i].x)
  230. #define    Y(i)    (road[i].y)
  231. #define    Z(i)    (road[i].z)
  232. #define B(i)    (road[i].bank)
  233. #define L(i)    (road[i].wl)
  234. #define R(i)    (road[i].wr)
  235.  
  236. void makeRdat()
  237. {
  238.     p3d p[RMAX][4];
  239.     poly rdpol ;
  240.     short ax,ay,l;
  241.     short x,y,z;
  242.     int i,lz,j,a,b;
  243.     road[0] = road[crd];
  244.     road[crd+1] = road[1];
  245.     //    スムージング
  246.     int smtlev = 3;
  247.     while(smtlev>=0)
  248.     {
  249.         smtlev--;
  250.         lz=road[crd-1].z ;
  251.         for(i=0; i<=crd; ++i)
  252.         {
  253.             a=road[i].stp;
  254.             b=road[i+1].stp;
  255.             j = ((lz*b+road[i+1].z*a)/(a+b)*1+road[i].z*1)/2 ;
  256.             lz = road[i].z ;
  257.             road[i].z = j;
  258.         }
  259.         road[crd+1] = road[1];
  260.     }
  261.     //    道幅変更(^^;)
  262.     for(i=0; i<=crd+1; ++i)
  263.     {
  264.         road[i].wr = road[i].wr*RDMAG ;
  265.         road[i].wl = road[i].wl*RDMAG ;
  266.     }
  267.     for(i=0; i<=crd; ++i)
  268.     {
  269.         ay = X(i+1) - X(i) ;
  270.         ax =-Y(i+1) + Y(i) ;
  271.         l = sqrt( ax*ax + ay*ay );
  272.  
  273.         p[i][0].x = X(i) - ax* (L(i)+EDGE)/l ;
  274.         p[i][0].y = Y(i) - ay* (L(i)+EDGE)/l ;
  275.         p[i][0].z = Z(i) + (L(i)+EDGE)*sin((B(i)+20)*pi/1800)*10 ;
  276.  
  277.         p[i][1].x = X(i) - ax* L(i)/l ;
  278.         p[i][1].y = Y(i) - ay* L(i)/l ;
  279.         p[i][1].z = Z(i) + L(i)*sin(B(i)*pi/1800)*10 ;
  280.  
  281.         p[i][2].x = X(i) + ax* R(i)/l ;
  282.         p[i][2].y = Y(i) + ay* R(i)/l ;
  283.         p[i][2].z = Z(i) - R(i)*sin((B(i)+20)*pi/1800)*10 ;
  284.  
  285.         p[i][3].x = X(i) + ax* (R(i)+EDGE)/l ;
  286.         p[i][3].y = Y(i) + ay* (R(i)+EDGE)/l ;
  287.         p[i][3].z = Z(i) - (R(i)+EDGE)*sin(B(i)*pi/1800)*10 ;
  288.     }
  289.     for(i=0; i<4; ++i)
  290.         p[crd+1][i] = p[crd][i];
  291.     for(i=0; i<crd; ++i)
  292.     {
  293.         mapdata[pn].pt[0] = p[i][0] ;
  294.         mapdata[pn].pt[1] = p[i+1][0] ;
  295.         mapdata[pn].pt[2] = p[i+1][1] ;
  296.         mapdata[pn].pt[3] = p[i][1] ;
  297.         mapdata[pn].type = (i%2==0 ? EDCOL1 : EDCOL2 ) ;
  298.         mapdata[pn].type = colset(mapdata[pn]);
  299.         
  300.         ++pn ;
  301.         mapdata[pn].pt[0] = p[i][1] ;
  302.         mapdata[pn].pt[1] = p[i+1][1] ;
  303.         mapdata[pn].pt[2] = p[i+1][2] ;
  304.         mapdata[pn].pt[3] = p[i][2] ;
  305.         mapdata[pn].type = ROADCOL ;
  306.         mapdata[pn].type = colset(mapdata[pn]);
  307.         ++pn ;
  308.         mapdata[pn].pt[0] = p[i][2];
  309.         mapdata[pn].pt[1] = p[i+1][2];
  310.         mapdata[pn].pt[2] = p[i+1][3];
  311.         mapdata[pn].pt[3] = p[i][3];
  312.         mapdata[pn].type = (i%2==0 ? EDCOL1 : EDCOL2 ) ;
  313.         mapdata[pn].type = colset(mapdata[pn]);
  314.         ++pn;
  315.  
  316.         rdpol.pt[0] = p[i][1] ;
  317.         rdpol.pt[1] = p[i+1][1] ;
  318.         rdpol.pt[2] = p[i+1][2] ;
  319.         rdpol.pt[3] = p[i][2] ;
  320.  
  321.         rddat[rd].px[0] = p[i][1].x ;
  322.         rddat[rd].py[0] = p[i][1].y ;
  323.         rddat[rd].px[1] = p[i+1][1].x ;
  324.         rddat[rd].py[1] = p[i+1][1].y ;
  325.         rddat[rd].px[2] = p[i+1][2].x ;
  326.         rddat[rd].py[2] = p[i+1][2].y ;
  327.         rddat[rd].px[3] = p[i][2].x ;
  328.         rddat[rd].py[3] = p[i][2].y ;
  329.         rddat[rd].pz = p[i][1].z ;
  330.         rddat[rd].kv = exterior( rdpol ) ;
  331.         rd++ ;
  332.     }
  333. }
  334.  
  335. save_texdat( short sx, short sy, double sang )
  336. {
  337.     short    sangle;
  338.     int i,j,k;
  339.     sang = sang*500/pi;
  340.     sangle = sang;
  341.     sangle = (sangle+10000)%1000;
  342.  
  343.     FILE *fp;
  344.     fp=fopen(MAPFILE,"wb");
  345.     if (fp==NULL) return 0;
  346.  
  347.     putShort(sx,fp);
  348.     putShort(sy,fp);
  349.     putShort(sangle,fp);
  350.  
  351.     putShort(polmax,fp);
  352.     for (i=0;i<polmax;i++){
  353.         for(j=0; j<4; ++j){
  354.             putShort(mapdata[i].pt[j].x,fp);
  355.             putShort(mapdata[i].pt[j].y,fp);
  356.             putShort(mapdata[i].pt[j].z,fp);
  357.         }
  358.         putShort(mapdata[i].type,fp);
  359.     }
  360.  
  361.     putShort(rd,fp);
  362.     fwrite((char *)rddat, sizeof(rdata), rd, fp);
  363.     putShort(chks,fp);
  364.     fwrite((char *)chk, sizeof(short), chks, fp);
  365.     fwrite((char *)exTime, sizeof(short), chks, fp);
  366.  
  367.     if (ferror(fp)){
  368.         puts("File write error!!");
  369.         return 0;
  370.     }
  371.     return 1;
  372. }
  373.  
  374. void    initGrp()
  375. {
  376.     EGB_init( EgbWork, EgbWorkSize );    /* 初期化           */
  377.     EGB_resolution ( EgbWork, 0, 3 );    /* 32k(320*240)        */
  378.     EGB_resolution ( EgbWork, 1, 3 );    /* 16 (640*480)        */
  379.     EGB_displayPage( EgbWork, 1, 3 );    /* 表示ページの指定    */
  380.  
  381.     EGB_writePage  ( EgbWork, 0    );
  382.     EGB_writeMode  ( EgbWork, 0    );    /*※描画モードの設定 */
  383.     EGB_paintMode  ( EgbWork, 0x20 );
  384. }
  385.  
  386. void    putlmap()
  387. {
  388.     int    i, j;
  389.     char    para[10];
  390.     struct {
  391.         unsigned short    num;
  392.         short    p[8];
  393.     } poly;
  394.     poly.num = 4;
  395.  
  396.     EGB_paintMode( EgbWork, 0x02 );
  397.     for(i=0; i<=25000; i+=500)
  398.     {
  399.         EGB_color( EgbWork, 0, i%5000==0 ? 9 : 1 );
  400.         WORD(para+0) = 2;
  401.         WORD(para+2) = 0;    WORD(para+4) = i*640/25000;//480
  402.         WORD(para+6) = 639;    WORD(para+8) = i*640/25000;
  403.         EGB_connect( EgbWork, para );
  404.         WORD(para+4) = 0;    WORD(para+2) = i*640/25000;
  405.         WORD(para+8) = 639;    WORD(para+6) = i*640/25000;
  406.         EGB_connect( EgbWork, para );
  407.     }
  408.  
  409.     EGB_paintMode( EgbWork, 0x02 );
  410.     for(i=0; i<polmax; ++i){
  411.         for(j=0; j<4; ++j){
  412.             poly.p[2*j  ] = mapdata[i].pt[j].x *640/25000;
  413.             poly.p[2*j+1] = mapdata[i].pt[j].y *640/25000;
  414.         }
  415.         EGB_color( EgbWork, 2, 15 );
  416.         EGB_polygon( EgbWork, &poly );
  417.     }
  418. }
  419. void    putPoly( pol, n, x,y,z, angle, dx,dy,dz, dcol )
  420.     poly *pol;
  421.     int n;
  422.     short x,y,z;
  423.     double angle;
  424.     int dx,dy,dz;
  425.     short dcol;
  426. {
  427.     dz *=10;
  428.     int i,j;
  429.     for(i=0; i<n; ++i)
  430.     {
  431.         for(j=0; j<4; ++j)
  432.         {
  433.             mapdata[pn].pt[j].x =    pol[i].pt[j].x*cos(angle)*dx -
  434.                                     pol[i].pt[j].y*sin(angle)*dy +x;
  435.             mapdata[pn].pt[j].y =    pol[i].pt[j].x*sin(angle)*dx +
  436.                                       pol[i].pt[j].y*cos(angle)*dy +y;
  437.             mapdata[pn].pt[j].z =    pol[i].pt[j].z*dz +z;
  438.             mapdata[pn].type = (pol[i].type)*dcol;
  439.         }
  440.         ++pn;
  441.     }
  442. }
  443.  
  444. //    以上 共通部分
  445. void    setPolData()
  446. {
  447.     //    Mountain    ( 四角錐 )
  448.     mt[0].pt[0].x =0;    mt[0].pt[0].y =1;    mt[0].pt[0].z =0;
  449.     mt[0].pt[1].x =1;    mt[0].pt[1].y =0;    mt[0].pt[1].z =0;
  450.     mt[0].pt[2].x =0;    mt[0].pt[2].y =0;    mt[0].pt[2].z =1;
  451.     mt[0].pt[3].x =0;    mt[0].pt[3].y =0;    mt[0].pt[3].z =1;
  452.     mt[0].type = 25;
  453.     mt[1].pt[0].x =1;    mt[1].pt[0].y =0;    mt[1].pt[0].z =0;
  454.     mt[1].pt[1].x =0;    mt[1].pt[1].y =-1;    mt[1].pt[1].z =0;
  455.     mt[1].pt[2].x =0;    mt[1].pt[2].y =0;    mt[1].pt[2].z =1;
  456.     mt[1].pt[3].x =0;    mt[1].pt[3].y =0;    mt[1].pt[3].z =1;
  457.     mt[1].type = 28;
  458.     mt[2].pt[0].x =0;    mt[2].pt[0].y =-1;    mt[2].pt[0].z =0;
  459.     mt[2].pt[1].x =-1;    mt[2].pt[1].y =0;    mt[2].pt[1].z =0;
  460.     mt[2].pt[2].x =0;    mt[2].pt[2].y =0;    mt[2].pt[2].z =1;
  461.     mt[2].pt[3].x =0;    mt[2].pt[3].y =0;    mt[2].pt[3].z =1;
  462.     mt[2].type = 31;
  463.     mt[3].pt[0].x =-1;    mt[3].pt[0].y =0;    mt[3].pt[0].z =0;
  464.     mt[3].pt[1].x =0;    mt[3].pt[1].y =1;    mt[3].pt[1].z =0;
  465.     mt[3].pt[2].x =0;    mt[3].pt[2].y =0;    mt[3].pt[2].z =1;
  466.     mt[3].pt[3].x =0;    mt[3].pt[3].y =0;    mt[3].pt[3].z =1;
  467.     mt[3].type = 28;
  468.  
  469.     //    Stand
  470.     short    i,j,n;
  471.     short    scol[3][4]={ 
  472.         { C32K(31,0,10),C32K(31,0,15),C32K(31,0,12),C32K(31,0,16) },
  473.         { C32K(31,0,18),C32K(31,0,22),C32K(31,0,10),C32K(31,0,19) },
  474.         { C32K(31,0,15),C32K(31,0,11),C32K(31,0,18),C32K(31,0,13) } };
  475.     for(i=0; i<4; ++i)
  476.         for(j=0; j<3; ++j){
  477.             n=i*3+j;
  478.     stand[n].pt[0].x =i;    stand[n].pt[0].y =-j;    stand[n].pt[0].z =j;
  479.     stand[n].pt[1].x =i+1;    stand[n].pt[1].y =-j;    stand[n].pt[1].z =j;
  480.     stand[n].pt[2].x =i+1;    stand[n].pt[2].y=-j-1;    stand[n].pt[2].z =j+1;
  481.     stand[n].pt[3].x =i;    stand[n].pt[3].y=-j-1;    stand[n].pt[3].z =j+1;
  482.     stand[n].type = scol[j][i];
  483.         }
  484.  
  485.     //    Pond
  486.     pd[0].pt[0].x =-15;    pd[0].pt[0].y =5;    pd[0].pt[0].z =0;
  487.     pd[0].pt[1].x =-5;    pd[0].pt[1].y =7;    pd[0].pt[1].z =0;
  488.     pd[0].pt[2].x =0;    pd[0].pt[2].y =15;    pd[0].pt[2].z =0;
  489.     pd[0].pt[3].x =-12;    pd[0].pt[3].y =15;    pd[0].pt[3].z =0;
  490.     pd[0].type = 31;
  491.     pd[1].pt[0].x =-12;    pd[1].pt[0].y =15;    pd[1].pt[0].z =0;
  492.     pd[1].pt[1].x =0;    pd[1].pt[1].y =15;    pd[1].pt[1].z =0;
  493.     pd[1].pt[2].x =2;    pd[1].pt[2].y =22;    pd[1].pt[2].z =0;
  494.     pd[1].pt[3].x =-3;    pd[1].pt[3].y =25;    pd[1].pt[3].z =0;
  495.     pd[1].type = 31;
  496.     pd[2].pt[0].x =25;    pd[2].pt[0].y =5;    pd[2].pt[0].z =0;
  497.     pd[2].pt[1].x =30;    pd[2].pt[1].y =13;    pd[2].pt[1].z =0;
  498.     pd[2].pt[2].x =25;    pd[2].pt[2].y =20;    pd[2].pt[2].z =0;
  499.     pd[2].pt[3].x =17;    pd[2].pt[3].y =17;    pd[2].pt[3].z =0;
  500.     pd[2].type = 31;
  501.  
  502.     //    Gate
  503.     gt[0].pt[0].x =0;    gt[0].pt[0].y =-10;    gt[0].pt[0].z =0;
  504.     gt[0].pt[1].x =0;    gt[0].pt[1].y =-11;    gt[0].pt[1].z =0;
  505.     gt[0].pt[2].x =0;    gt[0].pt[2].y =-11;    gt[0].pt[2].z =8;
  506.     gt[0].pt[3].x =0;    gt[0].pt[3].y =-10;    gt[0].pt[3].z =8;
  507.     gt[0].type = 31;
  508.     gt[1].pt[0].x =0;    gt[1].pt[0].y =10;    gt[1].pt[0].z =0;
  509.     gt[1].pt[1].x =0;    gt[1].pt[1].y =11;    gt[1].pt[1].z =0;
  510.     gt[1].pt[2].x =0;    gt[1].pt[2].y =11;    gt[1].pt[2].z =8;
  511.     gt[1].pt[3].x =0;    gt[1].pt[3].y =10;    gt[1].pt[3].z =8;
  512.     gt[1].type = 31;
  513.     gt[2].pt[0].x =0;    gt[2].pt[0].y =-11;    gt[2].pt[0].z =8;
  514.     gt[2].pt[1].x =0;    gt[2].pt[1].y =-11;    gt[2].pt[1].z =10;
  515.     gt[2].pt[2].x =0;    gt[2].pt[2].y =11;    gt[2].pt[2].z =10;
  516.     gt[2].pt[3].x =0;    gt[2].pt[3].y =11;    gt[2].pt[3].z =8;
  517.     gt[2].type = 31;
  518.     
  519.     //    Check Point
  520.     cp[0].pt[0].x =0;    cp[0].pt[0].y =-10;    cp[0].pt[0].z =0;
  521.     cp[0].pt[1].x =0;    cp[0].pt[1].y =-11;    cp[0].pt[1].z =0;
  522.     cp[0].pt[2].x =0;    cp[0].pt[2].y =-11;    cp[0].pt[2].z =10;
  523.     cp[0].pt[3].x =0;    cp[0].pt[3].y =-10;    cp[0].pt[3].z =10;
  524.     cp[0].type = 31;
  525.     cp[1].pt[0].x =0;    cp[1].pt[0].y =10;    cp[1].pt[0].z =0;
  526.     cp[1].pt[1].x =0;    cp[1].pt[1].y =11;    cp[1].pt[1].z =0;
  527.     cp[1].pt[2].x =0;    cp[1].pt[2].y =11;    cp[1].pt[2].z =10;
  528.     cp[1].pt[3].x =0;    cp[1].pt[3].y =10;    cp[1].pt[3].z =10;
  529.     cp[1].type = 31;
  530.  
  531.     //    Curve ( Panel )
  532.     cvp[0].pt[0].x =0;    cvp[0].pt[0].y =-10;    cvp[0].pt[0].z =49;
  533.     cvp[0].pt[1].x =0;    cvp[0].pt[1].y =0;        cvp[0].pt[1].z =42;
  534.     cvp[0].pt[2].x =0;    cvp[0].pt[2].y =10;     cvp[0].pt[2].z =42;
  535.     cvp[0].pt[3].x =0;    cvp[0].pt[3].y =0;        cvp[0].pt[3].z =49;
  536.     cvp[0].type = C32K(0,30,30);
  537.     cvp[1].pt[0].x =0;    cvp[1].pt[0].y =-10;    cvp[1].pt[0].z =35;
  538.     cvp[1].pt[1].x =0;    cvp[1].pt[1].y =0;        cvp[1].pt[1].z =42;
  539.     cvp[1].pt[2].x =0;    cvp[1].pt[2].y =10;     cvp[1].pt[2].z =42;
  540.     cvp[1].pt[3].x =0;    cvp[1].pt[3].y =0;        cvp[1].pt[3].z =35;
  541.     cvp[1].type = C32K(0,30,30);
  542.     cvp[3].pt[0].x =0;    cvp[3].pt[0].y =0;    cvp[3].pt[0].z =19;
  543.     cvp[3].pt[1].x =0;    cvp[3].pt[1].y =10;    cvp[3].pt[1].z =19;
  544.     cvp[3].pt[2].x =0;    cvp[3].pt[2].y =10;    cvp[3].pt[2].z =12;
  545.     cvp[3].pt[3].x =0;    cvp[3].pt[3].y =0;    cvp[3].pt[3].z =19;
  546.     cvp[3].type = 0;
  547.     cvp[4].pt[0].x =0;    cvp[4].pt[0].y =0;    cvp[4].pt[0].z =5;
  548.     cvp[4].pt[1].x =0;    cvp[4].pt[1].y =10;    cvp[4].pt[1].z =5;
  549.     cvp[4].pt[2].x =0;    cvp[4].pt[2].y =10;    cvp[4].pt[2].z =12;
  550.     cvp[4].pt[3].x =0;    cvp[4].pt[3].y =0;    cvp[4].pt[3].z =5;
  551.     cvp[4].type = 0;
  552.     cvp[2].pt[0].x =0;    cvp[2].pt[0].y =-10;    cvp[2].pt[0].z =19;
  553.     cvp[2].pt[1].x =0;    cvp[2].pt[1].y =0;        cvp[2].pt[1].z =12;
  554.     cvp[2].pt[2].x =0;    cvp[2].pt[2].y =-10;    cvp[2].pt[2].z =5;
  555.     cvp[2].pt[3].x =0;    cvp[2].pt[3].y =-10;    cvp[2].pt[3].z =5;
  556.     cvp[2].type = 0;
  557. }
  558.  
  559. void    setStandLf( short r, short h, short l, short sz )
  560. {
  561.     short    sx,sy;
  562.     sx = cx+r*sin(cang);
  563.     sy = cy-r*cos(cang);
  564.     putPoly( stand, 12, sx,sy,sz, cang, l/4, h/2, h/3, 1);
  565. }
  566.  
  567. void    setStandRt( short r, short h, short l )
  568. {
  569.     short    sx,sy;
  570.     sx = cx-r*sin(cang);
  571.     sy = cy+r*cos(cang);
  572.     putPoly( stand, 12, sx,sy,cz, cang, l/4, -h/2, h/3, 1);
  573. }
  574.  
  575. int     putChkPt()
  576. {
  577.     putPoly( cp, 2,cx,cy,cz,cang, 1, (_max(cwr,cwl)+9)/10, 5, C32K(0,1,1));
  578.     return crd;
  579. }
  580.  
  581. main()
  582. {
  583. puts("start:");
  584.     setPolData();
  585.  
  586.     int    i;
  587.     double    ang,mang;
  588.     pn = 0;
  589.     putPoly( mt, 4, 13060,5700,0, 0.0,    300,300,200, C32K(0,0,1) );
  590. //    putPoly( mt, 4, 2000, 14000, 0, 0,    50, 50, 80,  C32K(1,0,1) );
  591. //    putPoly( mt, 4, 21000, 6000, 0, 0,    50, 50, 80,  C32K(1,0,1) );
  592. //    putPoly( pd, 3, 16000, 5000, 0, 0,    100,100,1, 1);
  593.  
  594.     crd = 0;
  595.  
  596.     cx = 15000;
  597.     cy = 5000;
  598.     cz = 400+1450;
  599.     cwl = 100;
  600.     cwr = 100;
  601.     cbank = 0;
  602.     cang = mang = 0;    //    x方向
  603.     setR(STEP);
  604.     setStandLf( 250, 150, 2000, cz-400 );
  605.     putPoly( gt, 3, 15000,5000,cz, cang, 120/10, 120/10, 10, C32K(1,1,1) );
  606.  
  607.     goStr(5433,-1300+1450);            //    Grand stand 
  608.     chk[0]=putChkPt();
  609.     cwr = 80;
  610.     cwl = 80;
  611.     mang = 55 *pi/180;        // 1st Corner
  612.     curveRt(1000,mang,-1450+1450,30);
  613.  
  614.     goStr(960,-1450+1450);
  615.     mang += 135 *pi/180;    // 2nd Corner        +190゚
  616.     curveRt(600,mang,-1300+1450,0);
  617.  
  618.     goStr(1581,-1000+1450);
  619.  
  620.     mang -= 60 *pi/180;        //    S-curve            +130゚
  621.     curveLf(700,mang,-850+1450,0);
  622.     goStr(293,-800+1450);
  623.     mang += 70 *pi/180;        //    +200
  624.     curveRt(700,mang,-400+1450,0);
  625.  
  626.     goStr(630,-50+1450);
  627.     mang = 130 *pi/180;
  628.     curveLf(800,mang,350+1450,0);
  629.  
  630.     goStr(492,450+1450);
  631.     mang = 240 *pi/180;
  632.     curveRt(700,mang,500+1450,0);
  633.  
  634.     goStr(960,800+1450);
  635.     mang = 160 *pi/180;
  636.     curveLf(1000,mang,1500+1450,0);
  637.  
  638.     goStr(234,1550+1450);
  639.     mang = 125 *pi/180;
  640.     curveLf(1800,mang,1750+1450,0);
  641.     mang = 85 *pi/180;
  642.     curveLf(1800,mang,1700+1450,0);
  643.  
  644.     goStr(1935,1550+1450);            // Degner Curve
  645.     mang = 130 *pi/180;
  646.     curveRt(150,mang,1530+1450,0);
  647.  
  648.     goStr(1238,1450+1450);
  649.     mang = 200 *pi/180;
  650.     curveRt(250,mang,1430+1450,0);
  651.  
  652.     goStr(800,1250+1450);
  653.     goStr(400,1250+1450);            // UnderPass
  654.     goStr(2671-1200,1500+1450);
  655.  
  656.     mang = 250 *pi/180;
  657.     curveRt(1100,mang,1700+1450,0);
  658.  
  659.     goStr(400,1870+1450);
  660.     chk[1]=putChkPt();
  661.  
  662.     cwr = 140;
  663.     cwl = 60;
  664.     goStr(300,2000+1450);
  665.     step = 50;
  666.     mang = 165 *pi/180;        //    HairpinCurve
  667.     curveLf(200,mang,2100+1450,50);
  668.     mang = 80 *pi/180;        //    HairpinCurve
  669.     curveLf(200,mang,2200+1450,0);
  670.     step = STEP;
  671.  
  672.     goStr(200,2250+1450);
  673.     cwl = 80;
  674.     cwr = 80;
  675.     goStr(1036,2450+1450);
  676.     mang = 100 *pi/180;
  677.     curveRt(2000,mang,2550+1450,0);
  678.     mang = 120 *pi/180;
  679.     curveRt(2000,mang,2550+1450,0);
  680.     mang = 150 *pi/180;
  681.     curveRt(2000,mang,2350+1450,0);
  682.  
  683.     goStr(700,2250+1450);
  684.     goStr(350,2250+1450);    //970
  685.     mang = 190 *pi/180;
  686.     curveRt(2500,mang,2450+1450,0);
  687.  
  688.     goStr(700,2550+1450);
  689.     goStr(200,2550+1450);
  690.     goStr(900,2350+1450);
  691.     chk[2]=putChkPt();
  692.  
  693.     mang = 120 *pi/180;
  694.     curveLf(600,mang,2450+1450,0);
  695.  
  696.     goStr(700,2550+1450);
  697.     mang = 25 *pi/180;
  698.     curveLf(600,mang,2500+1450,0);
  699.     mang = -5 *pi/180;
  700.     curveLf(1000,mang,2450+1450,0);
  701.     mang = -18 *pi/180;
  702.     curveLf(2000,mang,2400+1450,0);
  703.  
  704.     goStr(1170,1650+1450);    // ?
  705.     mang = -24 *pi/180;
  706.     curveLf(10000,mang,1000+1450,0);
  707.     mang = -30 *pi/180;
  708.     curveLf(10000,mang,1250+1450,0);
  709.  
  710. //    setStandRt( 250, 100, 3000, cz+100 ); 
  711.  
  712.     goStr(5880,1600+1450);
  713.     chk[3]=putChkPt();
  714.  
  715.     mang = -85 *pi/180;
  716.     curveLf(1300,mang,1570+1450,0);
  717.  
  718.     goStr(2400,1800+1450);
  719.     goStr(121,1800+1450);
  720.     mang = 0 *pi/180;
  721.     curveRt(2500,mang,500+1450,0);
  722.  
  723.     cwr = 100;
  724.     cwl = 100;
  725.     goStr(1161,400+1450);
  726.  
  727.     printf("pols : %dx3\n",crd);
  728.     printf("start: %d,%d end:%d,%d\n",road[0].x,road[0].y,
  729.                                     road[crd].x,road[crd].y);
  730.     for(i=0; chk[i]!=0; ++i)
  731.         printf("ChkPoint%d:%d\n",i,chk[i]);
  732.     chks = 4;
  733.     exTime[0] = 25;
  734.     exTime[1] = 15;
  735.     exTime[2] = 20;
  736.     exTime[3] = 20;
  737.  
  738.     makeRdat();
  739.     polmax = pn;
  740.     save_texdat(road[0].x-600,road[0].y,0);
  741.  
  742.     initGrp();
  743.     putlmap();
  744.     getchar();
  745.  
  746.     return 0;
  747. }
  748.  
  749.  
  750.